package com.qianyu.core.util;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class TimeUtil {

    // 年秒数
    public static final long yearSecond = 31536000;

    // 月秒数
    public static final long monthSecond = 2592000;

    // 日秒数
    public static final long daySecond = 86400;

    // 七日秒数
    public static final long sevenDaySecond = 604800;

    // 一小时秒数
    public static final long hourSecond = 3600;

    /**
     * 当前系统时间
     *
     * @return
     */
    public static long currentTimeMillis() {
        return System.currentTimeMillis();
    }

    /**
     * 当前时间戳
     *
     * @return
     */
    public static int unixTime() {
        return (int) DateUtil.currentSeconds();
    }

    /**
     * 转换字符串时间为时间戳
     *
     * @param date
     * @return
     */
    public static int unixTime(String date) {
        return (int) (DateUtil.parse(date).getTime() / 1000);
    }

    /**
     * 转换时间为时间戳
     *
     * @param date
     * @return
     */
    public static int unixTime(Date date) {
        return (int) (date.getTime() / 1000);
    }

    /**
     * 当天剩余秒数
     *
     * @return
     */
    public static long dayExpireSecond() {
        Date date = DateUtil.date();
        return ((DateUtil.endOfDay(date).getTime() - date.getTime()) / 1000);
    }

    /**
     * 天数
     *
     * @param day
     * @return
     */
    public static Date toExpireDate(Integer day) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.format(new Date());
        Calendar calendar = dateFormat.getCalendar();
        calendar.add(Calendar.DAY_OF_MONTH, day);
        return calendar.getTime();
    }

    public static String toDayLastTime(Date date){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
        return dateFormat.format(date);
    }

    /**
     * 当天起始时间
     *
     * @return
     */
    public static int beginOfDay() {
        return unixTime(DateUtil.beginOfDay(DateUtil.date()));
    }

    /**
     * 当天结束时间
     *
     * @return
     */
    public static int endOfDay() {
        return unixTime(DateUtil.endOfDay(DateUtil.date()));
    }

    /**
     * 指定时间起始时间
     *
     * @param date
     * @return
     */
    public static int beginOfDay(Date date) {
        return unixTime(DateUtil.beginOfDay(date));
    }

    /**
     * 指定时间结束时间
     *
     * @param date
     * @return
     */
    public static int endOfDay(Date date) {
        return unixTime(DateUtil.endOfDay(date));
    }

    /**
     * 指定时间起始时间
     *
     * @param date
     * @return
     */
    public static int beginOfDay(Integer date) {
        return unixTime(DateUtil.beginOfDay(DateUtil.date(date.longValue() * 1000)));
    }

    /**
     * 指定时间结束时间
     *
     * @param date
     * @return
     */
    public static int endOfDay(Integer date) {
        return unixTime(DateUtil.endOfDay(DateUtil.date(date.longValue() * 1000)));
    }

    /**
     * 指定时间起始时间
     *
     * @param date
     * @return
     */
    public static int beginOfMonth(Integer date) {
        return unixTime(DateUtil.beginOfMonth(DateUtil.date(date.longValue() * 1000)));
    }

    /**
     * 指定时间结束时间
     *
     * @param date
     * @return
     */
    public static int endOfMonth(Integer date) {
        return unixTime(DateUtil.endOfMonth(DateUtil.date(date.longValue() * 1000)));
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatYmdHms(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "yyyy-MM-dd");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatYmd(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "yyyy-MM-dd");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatDate(Integer date, String format) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), format);
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatY(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "yyyy");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatYm(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "yyyyMM");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatYMD(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "yyyyMMdd");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatMM(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "MM");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatM(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "M");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatDD(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "dd");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatD(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "d");
    }

    /**
     * 格式化时间戳
     *
     * @param date
     * @return
     */
    public static String formatYMDH(Integer date) {
        return DateUtil.format(DateUtil.date(date.longValue() * 1000), "yyyyMMddHH");
    }


    /**
     * 时间戳转Date
     *
     * @param date
     * @return
     */
    public static Date toDate(Integer date) {
        String time = formatYmdHms(date);
        return DateTime.of(time,"yyyy-MM-dd");
    }

    /**
     * 自定义时间 - 格式 - 多久前
     * @param time
     * @return
     */
//    public static String getCustomFormatTime(Integer time) {
//        Integer nowSecond = unixTime() - time;
//
//        if (nowSecond < TimeConstant.oneMinute) {
//            return (nowSecond < 0 ? 0 : nowSecond) + TimeConstant.secondAgo;
//        }
//        if (nowSecond < 60 * TimeConstant.oneMinute) {
//            nowSecond = toMinutes(nowSecond);
//            return (nowSecond <= 0 ? 1 : nowSecond) + TimeConstant.minuteAgo;
//        }
//        if (nowSecond < 24 * TimeConstant.oneHour) {
//            nowSecond = toHours(nowSecond);
//            return (nowSecond <= 0 ? 1 : nowSecond) + TimeConstant.hourAgo;
//        }
//        if (nowSecond < 30 * TimeConstant.oneDay) {
//            nowSecond = toDays(nowSecond);
//            return (nowSecond <= 0 ? 1 : nowSecond) + TimeConstant.dayAgo;
//        }
//        if (nowSecond < 12 * 4 * TimeConstant.oneWeek) {
//            nowSecond = toMonths(nowSecond);
//            return (nowSecond <= 0 ? 1 : nowSecond) + TimeConstant.monthAgo;
//        } else {
//            nowSecond = toYears(nowSecond);
//            return (nowSecond <= 0 ? 1 : nowSecond) + TimeConstant.yearAgo;
//        }
//    }

    /**
     * 分钟
     *
     * @param seconds
     * @return
     */
    public static int toMinutes(int seconds) {
        return seconds / 60;
    }

    /**
     * 小时
     *
     * @param seconds
     * @return
     */
    public static int toHours(int seconds) {
        return toMinutes(seconds) / 60;
    }

    /**
     * 天
     *
     * @param seconds
     * @return
     */
    public static int toDays(int seconds) {
        return toHours(seconds) / 24;
    }

    /**
     * 月
     *
     * @param seconds
     * @return
     */
    public static int toMonths(int seconds) {
        return toDays(seconds) / 30;
    }

    /**
     * 年
     *
     * @param seconds
     * @return
     */
    public static int toYears(int seconds) {
        return toDays(seconds) / 365;
    }

    public static void main(String[] args) {
        List<Long> a = new ArrayList<>();
        a.add(654641111l);
        a.add(899651656l);
        System.out.println(String.join(",",String.valueOf(a)));
    }

}
